package com.example.project3.util.CallBack;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName CallBackFactory .java
 * @Description 回调方法管理者, 内部MAP属性存储<列表名 ， 回调类列表>，如此设计是为了满足不同回调需求，如果整个系统的回调类只通过一个功能进行回调，则可以使用default列表。
 * @Author LiuJinyu
 * @Date 2023/5/28 0:02
 * @Version 1.0
 */

public class CallBackManager {
    /**
     * 这个MAP存储回调列表，默认是default列表，添加和执行回调都是使用的default列表。
     */
    private static final Map<String, List<CallBack>> MAP = new HashMap<String, List<CallBack>>();

    /**
     * 静态构造代码块初始化MAP
     */
    static {
        MAP.put("default", new LinkedList<CallBack>());
    }

    /**
     * 向default列表添加一个回调类
     *
     * @param callBack
     */
    public static void add(CallBack callBack) {
        MAP.get("default").add(callBack);
    }

    /**
     * 向指定的回调列表添加回调类，如果没有这个回调列表，将创建回调列表之后加入回调类。
     *
     * @param listName
     * @param callBack
     * @return
     */
    public static void add(String listName, CallBack callBack) {
        if (!MAP.containsKey(listName)) {
            register(listName);
        }
        MAP.get(listName).add(callBack);
    }

    /**
     * 创建一个回调列表
     *
     * @param listName
     */
    public static void register(String listName) {
        if (!MAP.containsKey(listName)) {
            MAP.put(listName, new LinkedList<CallBack>());
        }
    }

    /**
     * 遍历default列表下的所有回调类，并执行它们的callBack方法。
     */
    public static void doCallBack() {
        List<CallBack> default_ = MAP.get("default");
        for (CallBack c : default_) {
            c.callBack();
        }
    }

    /**
     * 遍历指定列表下的所有回调类，并执行它们的回调方法，回调完毕后返回true，如果不存在此指定列表则返回false。
     *
     * @param listName
     * @return
     */
    public static boolean doCallBack(String listName) {
        if (MAP.containsKey(listName)) {
            List<CallBack> temp = MAP.get(listName);
            for (CallBack c : temp) {
                c.callBack();
            }
            return true;
        }
        return false;
    }
}
